package cn.z2huo.demo.config;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

/**
 * <p>新增或插入操作时，自动填充字段
 * <p>更新时填充字段，必须要使用 {@link com.baomidou.mybatisplus.core.mapper.BaseMapper#update(Object, Wrapper)} 方法，
 * 不可以使用 {@link com.baomidou.mybatisplus.core.mapper.BaseMapper#update(Wrapper)}
 *
 * @author z2huo
 */
@Component
public class CommonFieldFillHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        if (metaObject != null) {
            Object createTime;
            if ((createTime = this.getFieldValByName("createTime", metaObject)) == null) {
                // 创建时间为 null 时，不管操作时间，都重新赋值一遍
                LocalDateTime now = LocalDateTime.now();
                this.setFieldValByName("createTime", now, metaObject);
                this.setFieldValByName("operateTime", now, metaObject);
            } else if (this.getFieldValByName("operateTime", metaObject) == null) {
                // 创建时间不为 null，操作时间为 null 时，给操作时间赋值为创建时间
                this.setFieldValByName("operateTime", createTime, metaObject);
            }
        }
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        if (metaObject != null) {
//            if (getFieldValByName("operateTime", metaObject) == null) {
//                // 更新时如果操作时间为 null，则给操作时间字段赋值
//                this.setFieldValByName("operateTime", LocalDateTime.now(), metaObject);
//            }

            // 更新时，总是更新操作时间
            this.setFieldValByName("operateTime", LocalDateTime.now(), metaObject);
        }
    }

}
